package com.tedu.API.thread;

import com.tedu.API.io.*;
import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式()->{} 【接口/抽象类--匿名内部类】
 *                    【集合遍历--匿名内部类】
 * Collection--->List:存重复元素并且有序
 *               Set:存无序并且不重复【保存数据结构一致】
 *               Queue: 队列结合业务
 *  Map--------->HashMap:键值对存储
 */
public class LambdaDemo {
    @Test
    public void testList(){
        //List集合: 保存元素
        List<String> list=new ArrayList<>();
        list.add("佛跳墙");
        list.add("龙井虾仁");
        list.add("扬州炒饭");
        list.add("一品锅");
        //集合的遍历方式: 普通for  增强for  支持forEach写法
        for (String str: list){
            System.out.println("增强for: "+str);
        }
        //支持forEach写法
        // Consumer接口针对List集合接口: 功能获取list接口元素
        //accept() 获取list集合的所有方法
        list.forEach(new Consumer<String>() {
            public void accept(String s) {
                System.out.println("consumer接口遍历方案: "+s);
            }
        });
        //支持forEach方法: 遍历集合元素【Consumer 匿名内部类】
        //编写Lambda表达式写法
        list.forEach(s->System.out.println("Lambda遍历方案: "+s));
    }

    //Map--------->HashMap:键值对存储
    @Test
    public void testMap(){
        //创建Map集合
        Map<Integer,String> map=new HashMap<>();
        map.put(1,"唐山");   // .put 进行存储
        map.put(2,"石家庄");
        map.put(3,"秦皇岛");
        map.put(4,"邯郸");
        //遍历集合: 普通for  增强for  forEach(BiConSummer接口--匿名内部类)
        //键值对-->Entry对象
        //BiConSummer接口---获取每组Entry对象---accept() 获取Entry对象
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("键"+integer+"值"+s);
            }
        });
        //使用Lambda表达式
        map.forEach((integer, s) -> System.out.println("Lambda键: "+integer+"Lambda值: "+s));
    }

    /**
     * 作业:
     *    1.使用Lambda表达式完成Thread线程创建
     *    2.使用Lambda表达式完成Runnable线程创建
     *    3.IO流---File流: ListFile(FileFilter接口)【5行代码】
     *    目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
     *    4.IO流---File流: ListFile(FileFilter接口)【2行代码】
     *    目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
     *    5.集合: 改写成Lambda写法
     *    目标: 【list包下ListAPI类下单元测试testComparator()】
     *    Lambda类下---完成作业
     * @LambdaHomeWork1---@LambdaHomeWork5
     *
     */
    @Test
    public void lambdaHomeWork1() {
        // 1.使用Lambda表达式完成Thread线程创建
        /*MyThread1 mt1=new MyThread1();
        mt1.start();
        for (int i=0;i<1000;i++){
            System.out.println("钱钱，发财~发财~~");
        }*/

        //方法一：
        new Thread(()->{for (int i=0;i<1000;i++){
            System.out.println("钱钱，发财~发财~~");
        }
        }).start();
        new Thread(()->{
            for (int i=0;i<1000;i++){
                System.out.println("我对你啊，是One心One意");
            }
        }).start();

        //方法二:
        // 1.使用Lambda表达式完成Thread线程创建
        //Thread类Java定义线程类---具备启动start---
        //Thread类封装Runnable类---线程run运行
        Thread t1=new Thread(()->{for (int i=0;i<1000;i++){
            System.out.println("钱钱,发财~~发财~~");
        }
        });
        t1.start();
        Thread t2=new Thread(()->{for (int i=0;i<1000;i++) {
            System.out.println("我对你啊，是One心One意");
        }
        });
        t2.start();
    }


    @Test
    public void lambdaHomeWork2(){
        //2.使用Lambda表达式完成Runnable线程创建
        //方法一:
        MyRunnable1 mr1=new MyRunnable1();
        Thread t1=new Thread(()->{
            for (int i=0;i<1000;i++){
                System.out.println("你是上天送给我的小礼物~~~");
            }
        });
        t1.start();
        MyRunnable2 mr2=new MyRunnable2();
        Thread t2=new Thread(()->{
            for (int i=0;i<1000;i++){
                System.out.println("这是上天送给我的小礼物吗?");
            }
        });
        t2.start();

        //方法二:
        //1.创建Runnable接口
        Runnable r1=()->{for (int i=0;i<1000;i++){
            System.out.println("你是上天送给我的小礼物~~");
        }};
        //2.创建Thread线程类  ---start()方法
        Thread b1=new Thread(r1);
        //3.启动线程
        b1.start();
        Runnable r2=()->{for (int i=0;i<1000;i++){
            System.out.println("这是上天送给我的小礼物吗?");
        }};
        Thread b2=new Thread(r2);
        b2.start();
    }


    @Test
    public void lambdaHomeWork3() throws IOException {
        //3.IO流---File流: ListFile(FileFilter接口)【5行代码】
        //  目标: 【io包下FilterAPI类】实现使用Lambda表达式完成

        //方法一: IO流---File流: ListFile(FileFilter接口) 【10行代码版本】
        //  目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
        File file = new File("." + File.separator + "API");
        System.out.println(file.getCanonicalPath());
        File[] subs = file.listFiles((File pathname) -> {
            String str = pathname.getName();
            System.out.println("获取文件夹名字: " + str);
            return str.startsWith("A");
        });
        if (subs != null) {
            for (int i = 0; i < subs.length; i++) {
                System.out.println("所有的文件和文件夹名字" + subs[i].getName());
            }


            //方法二: IO流---File流: ListFile(FileFilter接口) 【匿名内部类版本】
            //  目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
            File file1 = new File("." + File.separator + "API");
            System.out.println("路径：" + file.getCanonicalPath());
            //4.创建Filter接口对象---无法直接创建：实现类--实现--接口【创建】
            FileFilter my = new FileFilter() {
                public boolean accept(File pathname) {
                    String name = pathname.getName();
                    System.out.println("过滤出来文件夹名字：" + name);
                    return pathname.getName().startsWith("s");
                }
            };

            //方法三: IO流---File流: ListFile(FileFilter接口) 【7行代码版本】
             //  目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
            File file2 = new File("." + File.separator + "API");
            FileFilter my1 = (pathname) -> {
                return pathname.getName().startsWith("s");
            };
            //2.获取文件夹下的所有“子项：文件夹下包括所有文件和文件夹”
            File[] subs1 = file.listFiles(my);
            //3.打印子项下所有名字
            for (int i = 0; i < subs1.length; i++) {
                System.out.println("子项所有名字：" + subs1[i].getName());
            }

            //方法四: IO流---File流: ListFile(FileFilter接口) 【5行代码版本】
            //  目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
            File file3 = new File("." + File.separator + "API");
            //2.获取文件夹下的所有“子项：文件夹下包括所有文件和文件夹”
            File[] subs2 = file.listFiles((pathname) -> {
                return pathname.getName().startsWith("s");
            });
            //3.打印子项下所有名字
            for (int i = 0; i < subs2.length; i++) {
                System.out.println("子项所有名字：" + subs[i].getName());
            }

            //方法五: IO流---File流: ListFile(FileFilter接口) 【3行代码版本】
            //  目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
            File[] subs3 = new File("." + File.separator + "API").
                    listFiles((pathname) -> {
                        return pathname.getName()
                                .startsWith("s");
                    });
            //3.打印子项下所有名字   普通for改成增强for
            for (int i = 0; i < subs3.length; i++) {
                System.out.println("子项所有名字：" + subs3[i].getName());
            }

            //方法六: IO流---File流: ListFile(FileFilter接口) 【2行代码版本】
            //  目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
            for (File file4 : new File("." + File.separator + "API").
                    listFiles((pathname) -> {
                        return pathname.getName()
                                .startsWith("s");
                    })) {
                System.out.println("遍历后进行过滤完成的内容: " + file1);
            }
        }
    }
    @Test
    public void lambdaHomeWork4(){
        // 4.IO流---File流: ListFile(FileFilter接口)【2行代码】
        //    目标: 【io包下FilterAPI类】实现使用Lambda表达式完成
        //String[] data= new String[]{".", "API"};
        for (File file:new File("." + File.separator + "API").
                listFiles((pathname)->{return pathname.getName()
                        .startsWith("s");})){
            System.out.println("遍历后进行过滤完成的内容: "+file);
        }
      }

    @Test
    public void lambdaHomeWork5() {
        // 5.集合: 改写成Lambda写法
        //   目标: 【list包下ListAPI类下单元测试testComparator()】
        List<String> list = new ArrayList<>();
        list.add("雪霁羹");
        list.add("扬州炒饭");
        list.add("鹄羹");
        Comparator comparator=new Comparator<String>(){
            public int compare(String o1, String o2) {
                  return o1.length()-o2.length();
            }
        };
        Collections.sort(list);
        System.out.println("排序后集合: "+list);


        Collections.sort(list,((o1, o2) -> {
            return o1.length()-o2.length();
        }));
        Collections.sort(list);
        System.out.println("排序后集合: "+list);
        }
    }
